#ifndef CUSTOMFILELISTWIDGET_H
#define CUSTOMFILELISTWIDGET_H

#include <QScrollArea>
#include <QWidget>
#include <QVBoxLayout>
#include <QSet>
#include <QList>
#include <QString>
#include <QPoint>
#include <QKeyEvent>
#include <QDrag>
#include <QMimeData>
#include <QDataStream>
#include <QPixmap>
#include "dragcontext.h"
#include <QPainter>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QDragLeaveEvent>
#include "unifiedfileinfo.h"
#include "virtuallistmanager.h"

// Forward declarations
class CustomFileItem;
class CustomFileBrowser;

/**
 * CustomFileListWidget - 虚拟化文件列表控件
 *
 * 真虚拟化架构：
 * 1. Item池固定（20-100个），永不删除
 * 2. 滚动时动态绑定item到文件数据
 * 3. 删除文件时只重新绑定，不删除item
 * 4. 支持1000+大文件列表
 * 5. 零崩溃（item永不删除）
 * 6. 极致性能（item复用，无内存分配）
 *
 * 核心特性：
 * 1. 纯UI层，无数据存储
 * 2. 基于QScrollArea + QVBoxLayout + VirtualListManager
 * 3. 所有操作都委托给父类处理
 * 4. 简单的事件转发和UI更新
 * 5. 无复杂的状态管理
 */

class CustomFileListWidget : public QScrollArea
{
    Q_OBJECT

public:
    explicit CustomFileListWidget(CustomFileBrowser* parent);
    ~CustomFileListWidget() override;
    
    // === 虚拟化核心方法 ===
    void rebindVisibleItems();          // 重新绑定可见区域的item（替代refreshUI）
    void rebindAllItems();              // 重新绑定所有item（排序/删除后）
    void updateItemPool();              // 更新item池大小（窗口resize时）
    
    // === 纯UI操作方法 ===
    void refreshUI(const QList<int>& draggedNewPositions = QList<int>()); // 【已废弃】保留兼容性
    void updateSelection(int index, bool emitSignals = true); // 更新选择状态（仅UI）
    void clearSelection();              // 清除选择状态（仅UI）
    void selectAll();                   // 全选所有文件（仅UI）
    void updateFileItem(int index);     // 更新单个文件项显示
    
    // === 自适应宽度管理 ===
    void updateItemWidths();            // 更新所有项目的自适应宽度
    void setAdaptiveMode(bool enabled); // 启用/禁用自适应模式
    bool isAdaptiveMode() const { return m_adaptiveMode; }

    // === 简单查询方法 ===
    int getCurrentSelectedIndex() const; // 获取当前选中索引（仅UI状态）
    QList<int> getSelectedIndices() const; // 获取选中索引列表（仅UI状态）
    
    // === 虚拟化调试接口 ===
    int getPoolSize() const;            // 获取当前item池大小
    int getBoundItemCount() const;      // 获取已绑定item数量
    QList<int> getVisibleFileIndices() const; // 获取可见文件索引列表

signals:
    // === 纯UI事件信号 ===
    void itemClicked(int index);
    void itemRightClicked(int index, const QPoint& globalPos);
    void itemDragRequested(const QList<int>& indices, int targetIndex);
    void selectionChanged(const QList<int>& selectedIndices);

protected:
    void keyPressEvent(QKeyEvent* event) override;
    void resizeEvent(QResizeEvent* event) override;  // 处理窗口尺寸变化（调整item池）
    void scrollContentsBy(int dx, int dy) override;  // 【新增】滚动事件（动态绑定item）
    bool eventFilter(QObject* watched, QEvent* event) override;  // 事件过滤器
    
    // 拖拽相关事件处理
    void dragEnterEvent(QDragEnterEvent* event) override;
    void dragMoveEvent(QDragMoveEvent* event) override;
    void dropEvent(QDropEvent* event) override;
    void dragLeaveEvent(QDragLeaveEvent* event) override;

private slots:
    void onItemClicked(CustomFileItem* item, Qt::KeyboardModifiers modifiers);
    void onItemRightClicked(CustomFileItem* item, const QPoint& globalPos);
    void onItemDragStarted(CustomFileItem* item, const QPoint& startPos);

private:
    void setupUI();
    void connectDragContext();                          // 连接拖拽上下文信号
    
    // === 虚拟化核心方法 ===
    void initializeItemPool();                          // 【新增】初始化item池
    void expandItemPool(int targetSize);                // 【新增】扩展item池
    void bindItemToFile(CustomFileItem* item, int fileIndex); // 【新增】绑定item到文件
    void unbindItem(CustomFileItem* item);              // 【新增】解除item绑定
    CustomFileItem* getItemForFileIndex(int fileIndex) const; // 【新增】获取文件对应的item
    int getFileIndexForItem(const CustomFileItem* item) const; // 【新增】获取item对应的文件索引
    
    // === 旧方法（逐步废弃） ===
    void clearAllItems();                               // 【已废弃】不再删除item
    void createItemsFromParentData();                   // 【已废弃】改用rebindAllItems
    void connectItemSignals(CustomFileItem* item);     // 连接单个项目信号
    int getItemIndex(const CustomFileItem* item) const; // 【已废弃】改用getFileIndexForItem

    // 拖拽功能
    void startDragOperation(const QList<int>& indices);
    QMimeData* createDragMimeData(const QList<int>& indices);
    QPixmap createDragPixmap(const QList<int>& indices);
    int getDropTargetIndex(const QPoint& pos) const;
    void showDropIndicator(int targetIndex);
    void hideDropIndicator();
    QIcon getFileIcon(const UnifiedFileInfo& fileInfo) const;
    
    // 重写paintEvent以绘制拖拽指示器
    void paintEvent(QPaintEvent* event) override;

    // 选择功能辅助方法
    void toggleItemSelection(int index);
    void selectRange(int start, int end);

    // === Martin Fowler重构：Extract Method - 选择状态恢复方法 ===
    void restoreSelectionAfterDrag(const QList<int>& draggedNewPositions);
    void restoreSelectionAfterRefresh(int savedCurrentIndex, const QSet<int>& savedSelectedIndices);
    void restoreSelectionAfterRefreshVirtualized(int savedCurrentIndex, const QSet<int>& savedSelectedIndices);  // 虚拟化版本

    // === 核心成员变量 ===
    CustomFileBrowser* m_parentBrowser;        // 父类引用（数据源）
    QWidget* m_contentWidget;                  // 滚动内容区域
    QVBoxLayout* m_layout;                     // 布局管理器
    
    // === 虚拟化核心 ===
    VirtualListManager* m_virtualManager;      // 【新增】虚拟化管理器
    QList<CustomFileItem*> m_itemPool;         // 【新增】Item池（永不删除）
    QList<CustomFileItem*> m_items;           // 【已废弃】逐步迁移到m_itemPool
    
    // === 选择状态 ===
    QSet<int> m_selectedIndices;              // 选中索引
    int m_currentIndex = -1;                  // 当前索引

    // 拖拽状态
    int m_dropIndicatorIndex = -1;
    bool m_isDragInProgress = false;
    QList<int> m_pendingDragPositions;          // 待处理的拖拽位置
    DragContext* m_dragContext;                 // 拖拽上下文管理器
    
    // 自适应布局状态
    bool m_adaptiveMode = true;                 // 是否启用自适应模式
    int m_currentWidth = 0;                     // 当前可用宽度
    
    // === 关键修复：UI刷新保护标志 ===
    bool m_isRefreshing = false;                // 是否正在刷新UI
};

#endif // CUSTOMFILELISTWIDGET_H